package com.lee.template.service;

import java.util.Map;

/**
 * @author zfl_a
 * @Desc 描述各个支付平台回调处理大致流程。验证签名(不同)，日志收集(相同)，验证签名状态(相同)，根据不同支付结果更新状态(不同)
 * @date 2020/8/12
 * @project springboot_design_pattern
 */
public abstract class AbstractPayCallbackTemplate {

    /**
     * 定义算法骨架。按照此流程执行相关操作
     * @return
     */
    public String asynCallBack() {

        // 验证签名(不同)
        Map<String,String> verifySignature = verifySignature();
        // 日志收集(相同)
        payLog(verifySignature);
        // 验证签名状态(相同)
        String code = verifySignature.get("code");
        if(!"200".equals(code)) {
            return fail();
        }
        // 根据不同支付结果更新状态(不同)
        return asyncPayResult(verifySignature);
    }

    /**
     * 失败结果
     * @return
     */
    protected abstract String fail();

    /**
     * 成功结果
     * @return
     */
    protected abstract String success();

    /**
     * 根据不同状态同步支付状态到数据库
     * @param verifySignature
     * @return
     */
    protected abstract String asyncPayResult(Map<String, String> verifySignature);

    /**
     * 日志收集
     * @param verifySignature
     */
    protected abstract void payLog(Map<String, String> verifySignature);

    /**
     * 获取并验证签名
     * @return
     */
    protected abstract Map<String, String> verifySignature() ;
}
